package com.whmskj.xjlhsc.schedul.delayTask;

import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;


/**
 * 延时任务实体类
 * 实现Delayed接口，用于DelayQueue的排序和延迟判断
 */
public class DelayTask implements Delayed {
    private final String taskId; // 任务唯一标识
    private final long executeTime; // 任务执行时间（纳秒）
    private final Runnable task; // 任务执行逻辑

    /**
     * 构造延时任务
     * @param taskId 任务ID
     * @param delay 延迟时间
     * @param unit 时间单位
     * @param task 任务逻辑
     */
    public DelayTask(String taskId, long delay, TimeUnit unit, Runnable task) {
        this.taskId = taskId;
        // 计算任务执行的绝对时间（当前时间 + 延迟时间）
        this.executeTime = System.nanoTime() + unit.toNanos(delay);
        this.task = task;
    }

    /**
     * 获取剩余延迟时间（纳秒）
     * 当返回值 <= 0 时，任务到期可执行
     */
    @Override
    public long getDelay(TimeUnit unit) {
        // 剩余时间 = 执行时间 - 当前时间（纳秒）
        long remaining = executeTime - System.nanoTime();
        // 转换为指定时间单位返回
        return unit.convert(remaining, TimeUnit.NANOSECONDS);
    }

    /**
     * 任务排序：按执行时间升序（先到期的任务排在前面）
     */
    @Override
    public int compareTo(Delayed other) {
        if (other == this) {
            return 0;
        }
        // 比较执行时间，当前任务执行时间小则返回-1（排在前面）
        return Long.compare(this.executeTime, ((DelayTask) other).executeTime);
    }

    // 执行任务
    public void run() {
        try {
            task.run(); // 执行具体任务逻辑
        } catch (Exception e) {
            System.err.println("任务 " + taskId + " 执行失败：" + e.getMessage());
        }
    }

    public String getTaskId() {
        return taskId;
    }
}
    